/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package metodogauss;

import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;

/**
 *
 * @author Igor
 */
public class MudaPerspectiva {

    double[] fatoresEscala = new double[2];
    Point cantoES;
    Point cantoDS;
    Point cantoEI;
    Point cantoDI;

    @SuppressWarnings("empty-statement")
    
    public void calculaFatorEscala(ArrayList<Point> cantosImagem, Dimension dimensoesPainelLousa) {

        if (cantosImagem.size()!=4)
             return;    //já deu erro porque tem q ter 4 cantos da imagem
         else {
             cantoES = cantosImagem.get(0); //esquerdo superior
             cantoDS = cantosImagem.get(1); //direito superior
             cantoEI = cantosImagem.get(2); //esquerdo inferior
             cantoDI = cantosImagem.get(3);  //direito inferior

             int larguraProjetada = Math.abs(cantoES.x - cantoDS.x); //largura da imagem projetada
             int alturaProjetada = Math.abs(cantoES.y-cantoEI.y); //altura da imagem projetada

             fatoresEscala[0] = (double)(dimensoesPainelLousa.width/larguraProjetada); //calcula um fator de escala pra largura e altura
             fatoresEscala[1] = (double)(dimensoesPainelLousa.height/alturaProjetada);

        }

    }

    public Point ajustaPonto (Point pontoCursor) {
        double dx = distRetaPonto (pontoCursor, cantoES,cantoDS);
        double dy = distRetaPonto (pontoCursor, cantoES,cantoEI);
                
        Point pontoTransladado = new Point();  //instancia um novo ponto
        pontoTransladado.x = (int) Math.round((dx) * fatoresEscala[0]);
        pontoTransladado.y = (int) Math.round((dy) * fatoresEscala[1]);

        return pontoTransladado;
    }

    //calcula a equação reduzida da reta
    private static double[] calculaEquacaoReta (Point pontoA, Point pontoB) {

        double A = (double)((double)(pontoB.y-pontoA.y))/(double)((double)(pontoB.x)-(double)(pontoA.x));
        double B = pontoA.y - A*pontoA.x;

        double[] coeficientes = new double[2];
        coeficientes[0] = A;
        coeficientes[1] = B;

        return coeficientes;
    }

    //calcula distância até ponto se passando o ponto e os coeficientes angular e linear da reta
    private static double distRetaPonto(Point pontoCursor, double[] coeficientesDaReta) {
        
        double dist = Math.abs((double)((double)coeficientesDaReta[0]*pontoCursor.x+(-1*pontoCursor.y)+ coeficientesDaReta[1])/((double)Math.sqrt(coeficientesDaReta[0]*coeficientesDaReta[0]+coeficientesDaReta[1]*coeficientesDaReta[1])));
        return dist;
    }

    //calcula distância até ponto se passando o ponto e os pontos que compõem a reta
      private static double distRetaPonto(Point pontoCursor, Point pontoA, Point pontoB) {

        float a;
        float b;
        float c;

        float dist;

        a =  (pontoA.y - pontoB.y);
        b = (pontoB.x - pontoA.x);
        c = (pontoA.x*pontoB.y - pontoA.x*pontoB.y);

        dist = (float) (Math.abs(a * pontoCursor.x + b * pontoCursor.y + c) / (Math.sqrt(a * a + b * b)));


        return dist;
    }

}
